#pragma once

#include "XMLElement.h"
#include "Position.h"
#include "Log.h"
#include "LogFactory.h"
#include <list>
#include <string>
#include <sstream>
#include <iostream>
#include "Texture.h"
#include "Color.h"
#include <math.h>
#include "FileNotFoundException.h"
#include "ValidationUtils.h"

class FactoryUtil {
	
	public: FactoryUtil();
	
	public: virtual ~FactoryUtil();

	private: Log* log;
			 
	
	/*
	 *	Apartir de un XMLElement* extrae el elemento ID de dicho nodo.
	 */	
	public: string buildId(XMLElement*);

	
	/*
	 *	Apartir de un XMLElement* extrae el elemento position de dicho nodo validando si se encuentra mas de una vez, 
	 */
	public: Position* buildSapoPosition(XMLElement*);
	public: Position* buildDrainagePosition(XMLElement*);
	
	/*
	 *	Apartir de un XMLElement* extrae el elemento radio de dicho nodo validando si se encuentra mas de una vez,proponiendo valores default.	
	 */	
	public: float buildSapoRadius(XMLElement*);
	public: float buildDrainageRadius(XMLElement*);

	
	/*
	 *	Apartir de un XMLElement* extrae el elemento Texture de dicho nodo validando si se encuentra mas de una vez, proponiendo valores default.		
	 */		
	public: Texture* buildSapoTexture(XMLElement*);
	public: Texture* buildDrainageTexture(XMLElement*);

	/*
	 *	Apartir de un XMLElement* extrae el elemento Color de dicho nodo validando si se encuentra mas de una vez, proponiendo valores default.	
	 */				
	public: Color* buildSapoColor(XMLElement*);
	public: Color* buildDrainageColor(XMLElement*);
			
			
	/*
	 *	Apartir de un XMLElement* extrae el elemento position de dicho nodo validando si se encuentra mas de una vez tomando por default los valores pasados como parametro.	
	 */	
	public: Position* buildPosition(XMLElement*,Position* defaultPositionValues);
	
	/*
	 *	Apartir de un XMLElement* extrae el elemento radio de dicho nodo validando si se encuentra mas de una vez tomando por default los valores pasados como parametro.
	 */	
	public: float buildRadius(XMLElement*,float defaultRadius);

	/*
	 *	Apartir de un XMLElement* extrae el elemento Texture de dicho nodo validando si se encuentra mas de una vez, tomando por default los valores pasados como parametro.	
	 */			
	public: Texture* buildTexture(XMLElement*,Texture* defaultTextureValues);

	/*
	 *	Apartir de un XMLElement* extrae el elemento Texture de dicho nodo validando si se encuentra mas de una vez, tomando por default los valores pasados como parametro.	
	 */				
	public: Color* buildColor(XMLElement*,Color* defaultColor);

	public: Position* FactoryUtil::buildPosition( XMLElement* punto );

	/*
	Busca el color dentro del elemento, como atributo, usando el attributeName
	para localizarlo.
	De no encontrarlo registra el error y devuelve un Color con el valor default.
	*/
	public: Color* FactoryUtil::buildColor( XMLElement* element, 
											string attributeName, 
											string defaultValue );
	
};
